#include "cmsis_os2.h"
#include "ohos_init.h"


// 定义消息队列和任务句柄
osMessageQueueId_t g_queue;
osThreadId_t task1, task2;
#define BUFFER_LEN 50

/* 消息结构体（CMSIS-RTOS v2 需要明确的数据结构） */
typedef struct {
    char data[BUFFER_LEN];
} MsgBuf_t;

/* Send Task */
void send_Entry(void *argument) {
    uint32_t i = 0;
    osStatus_t status;
    MsgBuf_t msg;

    while (i < 5) {
        snprintf(msg.data, BUFFER_LEN, "test is message %d", i);
        i++;
        
        // 发送消息到队列（阻塞式）
        status = osMessageQueuePut(g_queue, &msg, 0, osWaitForever);
        if (status != osOK) {
            printf("Send failed: %d\n", status);
        }

        // 挂起当前任务
        osThreadSuspend(osThreadGetId());
    }

    // 挂起接收任务并删除队列
    osThreadSuspend(task2);
    osMessageQueueDelete(g_queue);
    printf("Queue deleted!\n");
}

/* Receive Task */
void recv_Entry(void *argument) {
    MsgBuf_t msg;
    osStatus_t status;

    while (1) {
        // 从队列接收消息（永久阻塞）
        status = osMessageQueueGet(g_queue, &msg, NULL, osWaitForever);
        if (status == osOK) {
            printf("Received: %s\n", msg.data);
            // 唤醒发送任务
            osThreadResume(task1);
        }
    }
}

/* 初始化函数 */
void Example_CreateTask(void) {
    // 创建消息队列（容量5，元素大小=MsgBuf_t）
    g_queue = osMessageQueueNew(5, sizeof(MsgBuf_t), NULL);
    
    // 配置任务属性
    osThreadAttr_t task_attr = {
        .name = "SendTask",
        .stack_size = 1024,
        .priority = osPriorityAboveNormal,  // 优先级需根据实际调整
    };

    // 创建发送任务
    task1 = osThreadNew(send_Entry, NULL, &task_attr);

    task_attr.name = "RecvTask";
    task_attr.priority = osPriorityNormal; // 接收任务优先级更高
    task2 = osThreadNew(recv_Entry, NULL, &task_attr);
}

APP_FEATURE_INIT(Example_CreateTask);